#include <string>
#include <iostream>
// 参考自：https://blog.csdn.net/weixin_42579072/article/details/103908483
class Base
{
public:
    ~Base()
    {
        std::cout << "Base dealloced ..." << std::endl;
    }
    virtual std::string getName()
    {
        return "Name Base";
    }
    int aVal = 10;
};

class Derived : public Base
{
public:
    ~Derived()
    {
        std::cout << "Derived dealloced ..." << std::endl;
    }
    virtual std::string getName() override
    {
        return "Name derived";
    }
    int aVal = 20;
};
int main()
{
    using std::cout;
    using std::endl;
    // 使用对象来测试
    cout << "使用对象进行测试:\n";
    Base b1;
    Derived d1;
    b1 = d1;
    cout << b1.getName() << endl;
    cout << b1.aVal << endl;
    cout << "使用引用进行测试:\n";

    Base *b2 = new Base();
    Derived *d2 = new Derived();
    b2 = d2;
    cout << b2->getName() << endl;
    cout << b2->aVal << endl;
    /*
    对象是不能实现多态的，指针是可以的，但是成员变量是不可以实现多态的。
    结论：无论赋值操作还是赋值构造时，一个类对象里面的vptr永远不会变，永远都会指向 所属类 的虚函数表。而当使用指针或者引用时，vptr会指向 继承类 的虚函数表。
    使用对象进行测试:
    Name Base
    10
    使用引用进行测试:
    Name derived
    10
    Derived dealloced ...
    Base dealloced ...
    Base dealloced ...
    */
    return 0;
}
